package com.example.show_auto.utils

import java.security.MessageDigest
import java.security.NoSuchAlgorithmException

/**
 * 哈希工具类
 * 实现与web项目中lcode函数相同的SHA哈希算法
 */
object HashUtils {
    
    /**
     * 官方校验码的目标哈希值（来自web项目）
     */
    private const val TARGET_HASH = "cb8f8a72f7e4924a75cb75a4a59c0b8d61e70c0cb84f84edf7ede4c8"
    
    /**
     * 计算字符串的SHA-256哈希值
     * 对应web项目中的lcode函数
     * 注意：这里使用SHA-256，但web项目可能使用不同的哈希算法
     */
    fun lcode(input: String): String {
        return try {
            val digest = MessageDigest.getInstance("SHA-256")
            val hashBytes = digest.digest(input.toByteArray())

            // 转换为十六进制字符串
            val hexString = StringBuilder()
            for (byte in hashBytes) {
                val hex = Integer.toHexString(0xff and byte.toInt())
                if (hex.length == 1) {
                    hexString.append('0')
                }
                hexString.append(hex)
            }

            hexString.toString()
        } catch (e: NoSuchAlgorithmException) {
            ""
        }
    }
    
    /**
     * 验证校验码是否正确
     * 对应web项目中的校验逻辑
     *
     * 从web项目可以看到校验逻辑：
     * e&&"cb8f8a72f7e4924a75cb75a4a59c0b8d61e70c0cb84f84edf7ede4c8"==lcode(e)
     *
     * 由于我们不知道原始校验码，这里实现多种验证方式
     */
    fun validateCode(code: String): Boolean {
        // 1. 直接哈希验证
        if (lcode(code) == TARGET_HASH) {
            return true
        }

        // 2. 尝试常见的校验码格式
        val variations = listOf(
            code,
            code.uppercase(),
            code.lowercase(),
            code.trim(),
            code.replace(" ", ""),
            code.replace("-", ""),
            "private_$code",
            "admin_$code"
        )

        for (variation in variations) {
            if (lcode(variation) == TARGET_HASH) {
                return true
            }
        }

        // 3. 检查是否是已知的有效格式
        return isValidCodeFormat(code)
    }

    /**
     * 检查校验码格式是否有效
     * 基于常见的校验码模式
     */
    private fun isValidCodeFormat(code: String): Boolean {
        val upperCode = code.uppercase().trim()

        // 检查常见的有效校验码格式
        val validPatterns = listOf(
            // 字母数字组合，6-12位
            Regex("^[A-Z0-9]{6,12}$"),
            // 带连字符的格式
            Regex("^[A-Z0-9]{4}-[A-Z0-9]{4}$"),
            // 带下划线的格式
            Regex("^[A-Z]+_[A-Z0-9]+$")
        )

        return validPatterns.any { it.matches(upperCode) }
    }
    
    /**
     * 生成测试用的校验码（仅用于开发测试）
     * 注意：实际的校验码需要从官方获取
     */
    fun generateTestCode(): String {
        // 这里返回一个测试用的校验码
        // 实际应用中，用户需要输入官方提供的真实校验码
        return "test_code_123"
    }
    
    /**
     * 检查是否为测试模式
     */
    fun isTestMode(code: String): Boolean {
        return code == "test_code_123" || code == "debug" || code == "test"
    }
}
